<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>18.2. Authenticating with AuthSub</title>
<link rel="stylesheet" href="dbstyle.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.72.0">
<link rel="start" href="index.html" title="Programmer's Reference Guide">
<link rel="up" href="zend.gdata.html" title="Chapter 18. Zend_Gdata">
<link rel="prev" href="zend.gdata.html" title="Chapter 18. Zend_Gdata">
<link rel="next" href="zend.gdata.clientlogin.html" title="18.3. Authenticating with ClientLogin">
<link rel="chapter" href="introduction.html" title="Chapter 1. Introduction to Zend Framework">
<link rel="chapter" href="zend.acl.html" title="Chapter 2. Zend_Acl">
<link rel="chapter" href="zend.auth.html" title="Chapter 3. Zend_Auth">
<link rel="chapter" href="zend.cache.html" title="Chapter 4. Zend_Cache">
<link rel="chapter" href="zend.config.html" title="Chapter 5. Zend_Config">
<link rel="chapter" href="zend.console.getopt.html" title="Chapter 6. Zend_Console_Getopt">
<link rel="chapter" href="zend.controller.html" title="Chapter 7. Zend_Controller">
<link rel="chapter" href="zend.currency.html" title="Chapter 8. Zend_Currency">
<link rel="chapter" href="zend.date.html" title="Chapter 9. Zend_Date">
<link rel="chapter" href="zend.db.html" title="Chapter 10. Zend_Db">
<link rel="chapter" href="zend.debug.html" title="Chapter 11. Zend_Debug">
<link rel="chapter" href="zend.dojo.html" title="Chapter 12. Zend_Dojo">
<link rel="chapter" href="zend.dom.html" title="Chapter 13. Zend_Dom">
<link rel="chapter" href="zend.exception.html" title="Chapter 14. Zend_Exception">
<link rel="chapter" href="zend.feed.html" title="Chapter 15. Zend_Feed">
<link rel="chapter" href="zend.filter.html" title="Chapter 16. Zend_Filter">
<link rel="chapter" href="zend.form.html" title="Chapter 17. Zend_Form">
<link rel="chapter" href="zend.gdata.html" title="Chapter 18. Zend_Gdata">
<link rel="chapter" href="zend.http.html" title="Chapter 19. Zend_Http">
<link rel="chapter" href="zend.infocard.html" title="Chapter 20. Zend_InfoCard">
<link rel="chapter" href="zend.json.html" title="Chapter 21. Zend_Json">
<link rel="chapter" href="zend.layout.html" title="Chapter 22. Zend_Layout">
<link rel="chapter" href="zend.ldap.html" title="Chapter 23. Zend_Ldap">
<link rel="chapter" href="zend.loader.html" title="Chapter 24. Zend_Loader">
<link rel="chapter" href="zend.locale.html" title="Chapter 25. Zend_Locale">
<link rel="chapter" href="zend.log.html" title="Chapter 26. Zend_Log">
<link rel="chapter" href="zend.mail.html" title="Chapter 27. Zend_Mail">
<link rel="chapter" href="zend.measure.html" title="Chapter 28. Zend_Measure">
<link rel="chapter" href="zend.memory.html" title="Chapter 29. Zend_Memory">
<link rel="chapter" href="zend.mime.html" title="Chapter 30. Zend_Mime">
<link rel="chapter" href="zend.openid.html" title="Chapter 31. Zend_OpenId">
<link rel="chapter" href="zend.paginator.html" title="Chapter 32. Zend_Paginator">
<link rel="chapter" href="zend.pdf.html" title="Chapter 33. Zend_Pdf">
<link rel="chapter" href="zend.registry.html" title="Chapter 34. Zend_Registry">
<link rel="chapter" href="zend.rest.html" title="Chapter 35. Zend_Rest">
<link rel="chapter" href="zend.search.lucene.html" title="Chapter 36. Zend_Search_Lucene">
<link rel="chapter" href="zend.server.html" title="Chapter 37. Zend_Server">
<link rel="chapter" href="zend.service.html" title="Chapter 38. Zend_Service">
<link rel="chapter" href="zend.session.html" title="Chapter 39. Zend_Session">
<link rel="chapter" href="zend.soap.html" title="Chapter 40. Zend_Soap">
<link rel="chapter" href="zend.test.html" title="Chapter 41. Zend_Test">
<link rel="chapter" href="zend.text.html" title="Chapter 42. Zend_Text">
<link rel="chapter" href="zend.timesync.html" title="Chapter 43. Zend_TimeSync">
<link rel="chapter" href="zend.translate.html" title="Chapter 44. Zend_Translate">
<link rel="chapter" href="zend.uri.html" title="Chapter 45. Zend_Uri">
<link rel="chapter" href="zend.validate.html" title="Chapter 46. Zend_Validate">
<link rel="chapter" href="zend.version.html" title="Chapter 47. Zend_Version">
<link rel="chapter" href="zend.view.html" title="Chapter 48. Zend_View">
<link rel="chapter" href="zend.xmlrpc.html" title="Chapter 49. Zend_XmlRpc">
<link rel="appendix" href="requirements.html" title="Appendix A. Zend Framework Requirements">
<link rel="appendix" href="coding-standard.html" title="Appendix B. Zend Framework Coding Standard for PHP">
<link rel="appendix" href="copyrights.html" title="Appendix C. Copyright Information">
<link rel="index" href="the.index.html" title="Index">
<link rel="subsection" href="zend.gdata.authsub.html#zend.gdata.authsub.login" title="18.2.1. Creating an AuthSub authenticated Http Client">
<link rel="subsection" href="zend.gdata.authsub.html#zend.gdata.authsub.logout" title="18.2.2. Revoking AuthSub authentication">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader"><table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">18.2. Authenticating with AuthSub</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="zend.gdata.html">Prev</a> </td>
<th width="60%" align="center">Chapter 18. Zend_Gdata</th>
<td width="20%" align="right"> <a accesskey="n" href="zend.gdata.clientlogin.html">Next</a>
</td>
</tr>
</table></div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="zend.gdata.authsub"></a>18.2. Authenticating with AuthSub</h2></div></div></div>
<p>
        The AuthSub mechanism enables you to write web applications
        that acquire authenticated access Google Data services,
        without having to write code that handles user credentials.
    </p>
<p>
        See <a href="http://code.google.com/apis/accounts/AuthForWebApps.html" target="_top">http://code.google.com/apis/accounts/AuthForWebApps.html</a>
        for more information about Google Data AuthSub authentication.
    </p>
<p>
        The Google documentation says the ClientLogin mechanism is appropriate
        for "installed applications" whereas the AuthSub mechanism is
        for "web applications."  The difference is that AuthSub requires
        interaction from the user, and a browser interface that can react
        to redirection requests.  The ClientLogin solution uses PHP code to
        supply the account credentials; the user is not required to enter her
        credentials interactively.
    </p>
<p>
        The account credentials supplied via the AuthSub mechanism are
        entered by the user of the web application.  Therefore they must be
        account credentials that are known to that user.
    </p>
<div class="note"><table border="0" summary="Note: Registered applications">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">Registered applications</th>
</tr>
<tr><td align="left" valign="top"><p>
            Zend_Gdata currently does not support use of secure tokens, because
            the AuthSub authentication does not support passing a digital certificate
            to acquire a secure token.
        </p></td></tr>
</table></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.gdata.authsub.login"></a>18.2.1. Creating an AuthSub authenticated Http Client</h3></div></div></div>
<p>
            Your PHP application should provide a hyperlink to the
            Google URL that performs authentication.  The static function
            <code class="code">Zend_Gdata_AuthSub::getAuthSubTokenUri()</code>
            provides the correct URL.  The arguments to this function include
            the URL to your PHP applicaion so that Google can redirect the
            user's browser back to your application after the user's
            credentials have been verified.
        </p>
<p>
            After Google's authentication server redirects the user's browser
            back to the current application, a GET request parameter is set,
            called <code class="code">token</code>.
            The value of this parameter is a single-use token that can be
            used for authenticated access.
            This token can be converted into a multi-use token and stored
            in your session.
        </p>
<p>
            Then use the token value in a call to
            <code class="code">Zend_Gdata_AuthSub::getHttpClient()</code>.
            This function returns an instance of Zend_Http_Client,
            with appropriate headers set so that subsequent requests your
            application submits using that Http Client are also authenticated.
        </p>
<p>
            Below is an example of PHP code for a web application
            to acquire authentication to use the Google Calendar service
            and create a Zend_Gdata client object using that authenticated
            Http Client.
        </p>
<pre class="programlisting">&lt;?php
$my_calendar = 'http://www.google.com/calendar/feeds/default/private/full';

if (!isset($_SESSION['cal_token'])) {
    if (isset($_GET['token'])) {
        // You can convert the single-use token to a session token.
        $session_token =  Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
        // Store the session token in our session.
        $_SESSION['cal_token'] = $session_token;
    } else {
        // Display link to generate single-use token
        $googleUri = Zend_Gdata_AuthSub::getAuthSubTokenUri(
            'http://'. $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'],
            $my_calendar, 0, 1);
        echo "Click &lt;a href='$googleUri'&gt;here&lt;/a&gt; to authorize this application.";
        exit();
    }
}

// Create an authenticated HTTP Client to talk to Google.
$client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['cal_token']);

// Create a Gdata object using the authenticated Http Client
$cal = new Zend_Gdata_Calendar($client);
        </pre>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.gdata.authsub.logout"></a>18.2.2. Revoking AuthSub authentication</h3></div></div></div>
<p>
            To terminate the authenticated status of a given token, use the
            <code class="code">Zend_Gdata_AuthSub::AuthSubRevokeToken()</code>
            static function.  Otherwise, the token is still valid for
            some time.
        </p>
<pre class="programlisting">&lt;?php
// Carefully construct this value to avoid application security problems.
$php_self = htmlentities(substr($_SERVER['PHP_SELF'], 0, strcspn($_SERVER['PHP_SELF'], "\n\r")), ENT_QUOTES);

if (isset($_GET['logout'])) {
    Zend_Gdata_AuthSub::AuthSubRevokeToken($_SESSION['cal_token']);
    unset($_SESSION['cal_token']);
    header('Location: ' . $php_self);
    exit();
}
        </pre>
<div class="note"><table border="0" summary="Note: Security notes">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">Security notes</th>
</tr>
<tr><td align="left" valign="top">
<p>
            The treatment of the <code class="code">$php_self</code> variable in the
            example above is a general security guideline, it is not
            specific to Zend_Gdata.  You should always filter content you
            output to http headers.
        </p>
<p>
            Regarding revoking authentication tokens, it is recommended to
            do this when the user is finished with her Google Data session.
            The possibility that someone can intercept the token and use
            it for malicious purposes is very small, but nevertheless it is
            a good practice to terminate authenticated access to any service.
        </p>
</td></tr>
</table></div>
</div>
</div>
<div class="navfooter"><table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="zend.gdata.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="zend.gdata.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="zend.gdata.clientlogin.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Chapter 18. Zend_Gdata </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> 18.3. Authenticating with ClientLogin</td>
</tr>
</table></div>
<div class="revinfo"></div>
</body>
</html>
